/**
 * 消息队列发送端
 * 
*/

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>

#include <sys/stat.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

struct msgbuf
{
    long mtype;
    int start;
    int end;
};

typedef struct msgbuf MSGDATA;

int main(int argc, char **argv)
{
    if (2 > argc)
    {
        fprintf(stderr, "%s <key>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    key_t key = (key_t)atoi(argv[1]);
    int msgid;
    if ((msgid = msgget(key, S_IRUSR | S_IWUSR | IPC_CREAT)) < 0)
    {
        perror("msgget error: ");
        exit(EXIT_FAILURE);
    }

    MSGDATA data1 = {2, 10, 100};
    MSGDATA data2 = {4, 1, 120};
    MSGDATA data3 = {7, 4, 70};
    MSGDATA data4 = {4, 7, 1020};
    MSGDATA data5 = {2, 80, 1100};

    if (msgsnd(msgid, &data1, sizeof(MSGDATA) - sizeof(long), IPC_NOWAIT) < 0)
    {
        perror("msgsnd error: ");
    }

    if (msgsnd(msgid, &data2, sizeof(MSGDATA) - sizeof(long), IPC_NOWAIT) < 0)
    {
        perror("msgsnd error: ");
    }

    if (msgsnd(msgid, &data3, sizeof(MSGDATA) - sizeof(long), IPC_NOWAIT) < 0)
    {
        perror("msgsnd error: ");
    }

    if (msgsnd(msgid, &data4, sizeof(MSGDATA) - sizeof(long), IPC_NOWAIT) < 0)
    {
        perror("msgsnd error: ");
    }

    if (msgsnd(msgid, &data5, sizeof(MSGDATA) - sizeof(long), IPC_NOWAIT) < 0)
    {
        perror("msgsnd error: ");
    }

    struct msqid_ds  buf;
    if (msgctl(msgid, IPC_STAT, &buf) < 0)
    {
        perror("msgctl error: ");
        exit(EXIT_FAILURE);
    }

    printf("key: %d\n", key);
    printf("msg id: %d\n", msgid);
    printf("msg total: %ld\n", buf.msg_qnum);
    return 0;
}